// coding: utf-8
// @Author : lryself
// @Date : 2020/10/16 22:08
// @Software: GoLand

package utils

import (
	"fmt"
	"reflect"
	"time"
)

//decoP传入函数地址（请提前生成，fn为函数）
func DecoratorExample(decoP, fn interface{}){
	var decorated_func, targetFunc reflect.Value
	//1.获取作为输出的函数（动态生成）
	decorated_func = reflect.ValueOf(decoP).Elem()
	//2.获取需要被装饰的函数
	targetFunc = reflect.ValueOf(fn)
	//3.通过反射生成一个新函数
	v:=reflect.MakeFunc(targetFunc.Type(),
		func(input []reflect.Value) (results []reflect.Value) {
			//4.装饰区域
			beginTime:=time.Now()
			results = targetFunc.Call(input)
			fmt.Println(time.Since(beginTime))
			return
		})
	//5.将输出结果储存到输出函数中
	decorated_func.Set(v)
	return
}
